/*
error_state.h
offer service layer error state data type define and api extern
designed by lunantng

----------------------
2020-11-20 10:50:51
create file
----------------------
*/
#ifndef __ERROR_STATE_H
#define __ERROR_STATE_H

#include "../bsp/base_type.h"
#include "mqtt.h"

/********************************data type define*******************************/
//terminal type
typedef enum{
    station=1,
    washer,
    dryer
}ERROR_terminal;

//station error
/*typedef struct{
    u8 power;   //外部供电状态，0=正常，1=无供电
    u8 washer1; //洗车机1故障
    u8 washer2; //洗车机2故障
    u8 dryer;   //风机故障
    u8 emergency;   //急停状态
    u8 offline1;    //设备1站内网络掉线
    u8 offline2;    //设备2站内网络掉线
}ERROR_station; //0=正常，1=错误状态触发
*/
typedef struct{
    //station
    u8 station_washer;      //洗车机掉线状态，0=在线，1=掉线
    u8 station_dryer;       //风机掉线状态，0=在线，1=掉线
    u8 station_emergency;   //站点急停状态，0=正常，1=触发急停
    u8 station_park;        //引导雷达不在线，0=正常，1=掉线

    //washer
    u8 washer_lifter;  //升降，0=正常，1=通信异常，2=报错，3=all
    u8 washer_turner;  //举平，0=正常，1=通信异常，2=报错，3=all
    u8 washer_wheel;    //轮子，0=正常，bit0~1 表示左轮，bit2~3：标识右轮  通信，报错
    u8 washer_collision;   //碰撞，0=正常，1=触发
    u8 washer_emergency;   //急停，0=正常，1=触发
    u8 washer_press;   //压停/挤停,0=正常，1=触发
    u8 washer_freq;    //变频器，0=正常，1=报错
    u8 washer_encoder; //编码器，0=正常，>0报错，bit0~2：标识三个独立的编码器是否报错，1，2，4
    u8 washer_lidar;    //雷达，0=正常，1=掉线
    u8 washer_inside;   //内区保护，0=正常，1=触发
    u8 washer_outside;  //外区保护，0=正常，1=触发
    u8 washer_carleave; //车辆离开，0=正常，1=触发
    u8 washer_origin;   //洗车机是否在待机位，0=正常，1=不在待机位
    u8 washer_back_door;    //洗车机背门，0=正常，1=没关门

    //dryer
    u8 dryer_lifter;    //升降，0=正常，1=通信异常，2=报错，3=all
    u8 dryer_wheel;     //左轮，0=正常，bit0~1：表示左轮，bit2~3:表示右轮，通信，报错
    u8 dryer_collision; //碰撞，0=正常，1=触发
    u8 dryer_freq;      //变频器，0=正常，1=报错
    u8 dryer_emergency; //急停，0=正常，1=触发
    u8 dryer_encoder;   //编码器，0=正常，>0报错，bit0~2：标识三个独立的编码器是否报错，1，2，4
    u8 dryer_lidar;     //雷达，0=正常，1=掉线
    u8 dryer_inside;    //内区保护，0=正常，1=触发
    u8 dryer_outside;   //外区保护，0=正常，1=触发
    u8 dryer_origin;    //风机是否在待机位，0=正常，1=不在待机位
    u8 dryer_back_door;    //风机背门，0=正常，1=没关门

}ERROR_station;

//agv error
typedef struct{
    u8 wheel0;  //正面车轮
    u8 wheel1;  //背面车轮
    u8 lidar0;  //竖向雷达
    u8 lidar1;  //横向雷达
    u8 safty;   //避障
    u8 tooNear; //过近检测，门两侧超声波
    u8 gyro;    //陀螺仪
    u8 navi;    //导航运动
}ERROR_agv; //0=正常，other=错误码

//washer error
typedef struct{
    u8 lifter;  //刷子升降
    u8 turner;  //刷子转向
    u8 putter;  //刷子推杆
    u8 door;    //门，BIT0=左门，BIT1=右门，BIT2=后门
    u8 brush;   //刷子旋转
    u8 conllision;  //碰撞
    u8 emergency;   //急停
    u8 offline;      //站内网络在线状态
    ERROR_agv agv;  //agv
}ERROR_washer;  //0=正常，other=错误码


//dryer eror
typedef struct{
    u8 lifter;  //风口升降
    u8 swing;   //风口摆动
    u8 wind;    //吹风电机
    u8 door;    //门，BIT0=左门，BIT1=右门，BIT2=后门
    u8 conllision;  //碰撞
    u8 emergency;   //急停
    u8 offline;      //站内网络在线状态
    ERROR_agv agv;  //agv
}ERROR_dryer;   //0=正常，other=错误码

// power massage
typedef struct{
    float voltage_v;        //voltage V
    float current_a;        //current A
}ERROR_power;

//terminal location   车头方向x正，车左侧是y正
typedef struct{
    int x;  //坐标x轴位置  mm
    int y;  //坐标y轴位置  mm
    int angle;  //机器角度方向  1/1000 度 在360度内
}ERROR_location;

// station status
typedef struct{
    int error;                  //error status,n0=no error,1=exist error
    int wash_start_count;       //wash start count
    int washing;                //washing stastus, 0=standby,1=washing,2=exception
    float water_m3;             //use water volume 立方米
    ERROR_power A_phase;        //power A phase
    ERROR_power B_phase;        //power B phase
    ERROR_power C_phase;        //power C phase
    float electricity_kwh;      //electricity  KW*h
    ERROR_location washer_location; //washer location
    ERROR_location dryer_location;  //dryer location
}ERROR_station_status;


//error all，每个业务只需要自己对应的对象就行
typedef struct{
    u8 init;    //初始化,0=未初始化，1=已初始化
    ERROR_terminal tml;    //终端类型
    MQTT_class *mqtt;   //通信对象
    ERROR_station station;  //站点
    ERROR_washer washer;    //洗车机
    ERROR_dryer dryer;      //风机
    ERROR_station_status station_status;    //station status
}ERROR_class;   //整机错误状态



/*********************************function extern**************************/
extern int xp_error_init(MQTT_class *mq,ERROR_terminal tml);   //error mudule init
extern void xp_error_update(ERROR_class *err);  //updata error status
extern ERROR_class *xp_error_statusObj_get(void);   //get error status obj
extern void xp_robot_error_clear(ERROR_terminal tml);   //clear terminal err
extern int xp_error_upload(void);  //upload error status 
extern void xp_error_state_check_regist(void (*check_fun)(void));   //regist error check function
extern char *xp_errorState_stationJson(void);   //make station error json


//debug
extern int xp_error_debug(char *type,char *fun,char *param);    //debug

#endif
//end of the file
